package modelo.tablero;

import java.util.HashMap;
import java.util.Map;

import modelo.excepcion.ExcepcionDeMovimientoInvalido;
import modelo.pieza.Pieza;

/**
 * 
 * 
 * @author Victor Del Rio
 */
public class Casilla {
	
	private Color color;
	private Pieza piezaAlojada = null;
	private Map<Direccion, Casilla> casillasVecinas = new HashMap<Direccion, Casilla>();
	
	
	/*------------------------------------ Constructors ------------------------------------*/

	public Casilla(Color color) {
		this.color = color;
		this.inicializarCasillasVecinas();
	}

	/*--------------------------------------------------------------------------------------*/
	/*------------------------------------ Public methods ----------------------------------*/

	public void alojar(Pieza pieza) throws ExcepcionDeMovimientoInvalido {
		
		if (this.estaVacia()) {
			setearPieza(pieza);
		}
		else {
			if (pieza.getColor().equals(this.piezaAlojada.getColor())) {
				throw new ExcepcionDeMovimientoInvalido("ya hay otra pieza de igual color en la casilla");
			}
			else {
				this.piezaAlojada.comer();
				setearPieza(pieza);
			}
		}
	}

	public Boolean estaVacia() {
		return piezaAlojada == null;
	}
	
	public Casilla getCasillaVecina(Direccion direccion) {
		return this.casillasVecinas.get(direccion);
	}
	
	public void setCasillaVecina(Direccion direccion, Casilla casillaVecina) {
		this.casillasVecinas.put(direccion, casillaVecina);
	}
	
	public Boolean hayCasillaVecina(Direccion direccion) {
		return this.getCasillaVecina(direccion) != null;
	}

	/*--------------------------------------------------------------------------------------*/
	/*----------------------------------- Private methods ----------------------------------*/

	private void setearPieza(Pieza pieza) {
		pieza.setCasilla(this);
		this.piezaAlojada = pieza;
	}
	
	private void inicializarCasillasVecinas() {
		
		for (Direccion direccion : Direccion.values()) {
			this.casillasVecinas.put(direccion, null);
		}
	}

	/*--------------------------------------------------------------------------------------*/
	/*---------------------------------- Geters and seters ---------------------------------*/

	public Color getColor() {
		return color;
	}
	
	public Pieza getPiezaAlojada() {
		return piezaAlojada;
	}
	
	/*--------------------------------------------------------------------------------------*/
	
	// TODO sacar este metodo cuando ya no sea útil. Es solo para debug.
	@Override
	public String toString() {
		return this.color.toString();
	}

}
